/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package riogol2;

import java.io.*;
import java.util.StringTokenizer;

/**
 *
 * @author chai
 */
/**
 * Luokka, joka hoitaa tiedoston k盲sittely盲 (lukeminen ja kirjoittaminen)
 */
public class FileHandler {

    private FileReader tiedosto;
    private FileWriter syottotiedosto;
    private BufferedReader br;
    private BufferedWriter bw;
    private int koko;
    private int askeleet;
    private int[][] soluMatriisi;

    /**
     * Save data to a file
     *
     * @param tiedostonNimi, johon tallennetaan uusiSoluMatriisi
     * @param uusiSoluMatriisi, jota tallennetaan uuteen tiedostoon
     */
    public void saveFile(String tiedostonNimi, int[][] uusiSoluMatriisi) throws IOException {
        if (tiedostonNimi == null || tiedostonNimi.isEmpty()) {
            tiedostonNimi = "Rio-" + Long.toString(System.nanoTime()) + ".txt";
        }
        try {
            syottotiedosto = new FileWriter(tiedostonNimi);
            bw = new BufferedWriter(syottotiedosto);
            bw.write(koko + " " + askeleet);
            for (int i = 0; i < koko; i++) {
                bw.newLine();
                for (int j = 0; j < koko - 1; j++) {
                    bw.write(Integer.toString(uusiSoluMatriisi[i][j]) + " ");
                }
                bw.write(Integer.toString(uusiSoluMatriisi[i][koko - 1]));
            }
        } catch (Exception e) {
            System.out.println("Tiedoston " + tiedostonNimi + " kirjoittaminen ep盲onnistui: " + e.getMessage());
        } finally {
            try {
                if (bw != null) {
                    bw.flush();
                    bw.close();
                    System.out.println("Tiedoston " + tiedostonNimi + " kirjoittaminen onnistui");
                }
            } catch (IOException ex) {
                System.out.println("Tiedoston " + tiedostonNimi + " kirjoittaminen ep盲onnistui: " + ex.getMessage());
            }
        }
    }

    /**
     * Load data from the file
     *
     * @param tiedostonNimi, josta luetaan datat
     */
    public void readFile(String tiedostonNimi) throws FileNotFoundException, IOException {
        String defaultfile = "/fs-1/2/kerola/rio_testdata/life_800_10000.txt";
        try {
            this.tiedosto = new FileReader(tiedostonNimi);
            System.out.println("Tiedoston " + tiedostonNimi + " lukeminen onnistui");
        } catch (Exception e) {
            System.out.println("Tiedoston " + tiedostonNimi + " lukeminen ep盲onnistui: " + e.getMessage());
            try {
                this.tiedosto = new FileReader(defaultfile);
                System.out.println("Tiedosto " + defaultfile + " lukeminen onnistui");
            } catch (Exception e2) {
                System.out.println("Tiedoston " + defaultfile + " lukeminen ep盲onnistui: " + e2.getMessage());
            }
        }
        try {
            br = new BufferedReader(tiedosto);
            String ekarivi = br.readLine();
            //System.out.println(ekarivi);
            StringTokenizer st = new StringTokenizer(ekarivi);
            koko = Integer.parseInt(st.nextToken());
            System.out.println("koko: " + koko);
            askeleet = Integer.parseInt(st.nextToken());
            System.out.println("askeleet: " + askeleet);
            soluMatriisi = new int[koko][koko];
            String rivi;
            int riviNumero = 0;
            StringTokenizer stz;
            while ((rivi = br.readLine()) != null) {
                stz = new StringTokenizer(rivi);
                for (int i = 0; i < koko; i++) {
                    soluMatriisi[riviNumero][i] = Integer.parseInt(stz.nextToken());
                }
                riviNumero++;
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public int[][] getSoluMatriisi() {
        return soluMatriisi;
    }

    public int getKoko() {
        return koko;
    }

    public int getAskeleet() {
        return askeleet;
    }
}